package com.vehicle.util;

import com.vehicle.bean.Area;
import com.vehicle.vo.ResultVO;

import java.util.*;

public class CapacityArea {

    public static List<Map<String, Object>> getScore(List<Map<String, Object>> parkingLots){
        // 定义一个空Map用于存储每个停车场的得分
         Map<Integer, Double> scores = new HashMap<>();
         // 遍历停车场列表，计算每个停车场的得分
         for (Map<String, Object> parkingLot : parkingLots) {
             // 获取该停车场的容量和当前已经停放的车辆数量
             int capacity = (int) parkingLot.get("capacity");
             int parkedCars = (int) parkingLot.get("parked_cars");
             // 计算该停车场的可用容量比例
             double availableRatio = (double) (capacity - parkedCars) / capacity;
             // 根据可用容量比例计算该停车场的得分
             double score;
             if (availableRatio >= 0.8) {
                 score = 5;// 容量充足，得分最高
             } else if (availableRatio >= 0.6) {
                 score = 4; // 容量较多，得分较高
             } else if (availableRatio >= 0.4) {
                 score = 3; // 容量一般，得分一般
             } else if (availableRatio >= 0.2) {
                 score = 2; // 容量较少，得分较低
             } else {
                 score = 1; // 容量不足，得分最低 }
                 // 考虑停车场的安全性因素进行打分
                 double securityScore = calculateSecurityScore(parkingLot);
                 // 将该停车场的综合得分存储到scores字典中
                 scores.put((int) parkingLot.get("id"), score + securityScore);
             }
             // 对所有停车场按照综合得分进行排序
             Collections.sort(parkingLots, new Comparator<Map<String, Object>>() {
                 @Override
                 public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                     return Double.compare(scores.get(o2.get("id")), scores.get(o1.get("id")));
                 }
             });
         }
        // 返回排序后的停车场列表
        return parkingLots;
    }

    private static double calculateSecurityScore(Map<String, Object> parkingLot) {
        // 获取该停车场的监控设备数量、照明设施数量和安保人员数量
        int cameras = (int) parkingLot.get("cameras");
        int lights = (int) parkingLot.get("lights");
        int securityPersonnel = (int) parkingLot.get("security_personnel");

        // 根据以上因素进行打分
        double score = 0;
        if (cameras >= 5) {
            score += 2;  // 监控设备数量达标，得分较高
        } else if (cameras >= 3) {
            score += 1;  // 监控设备数量一般，得分一般
        }
        if (lights >= 10) {
            score += 2;  // 照明设施数量达标，得分较高
        } else if (lights >= 5) {
            score += 1;  // 照明设施数量一般，得分一般
        }
        if (securityPersonnel > 0) {
            score += 2;  // 安保人员存在，得分较高
        }

        // 考虑周围环境因素进行打分
        double environmentScore = calculateEnvironmentScore(parkingLot);
        score += environmentScore;

        return score;
    }

    // 计算周围环境因素的得分
    private static double calculateEnvironmentScore(Map<String, Object> parkingLot) {
        boolean isNearDangerousArea = (boolean) parkingLot.get("is_near_dangerous_area");
        boolean hasSecurityIssues = (boolean) parkingLot.get("has_security_issues");

        double score = 0;
        if (!isNearDangerousArea && !hasSecurityIssues) {
            score += 2;   // 周围环境良好，得分较高
        } else if (!isNearDangerousArea || !hasSecurityIssues) {
            score += 1;   // 周围环境存在一定问题，得分一般
        }

        return score;
    }
}
